#include "loginwidget.h"
#include "ui_loginwidget.h"
#include "global.h"
#include "httpmgr.h"
#include "tcpmgr.h"

#include <QJsonObject>
LoginWidget::LoginWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::LoginWidget)
{
    ui->setupUi(this);
    connect(ui->register_btn,&QPushButton::clicked,
            this,&LoginWidget::SwitchReg);
    ui->reset_btn->setStyleSheet("border:none;");
    connect(ui->reset_btn,&QPushButton::clicked,
            this,&LoginWidget::SwitchRes);
    connect(ui->login_btn,&QPushButton::clicked,
            this,&LoginWidget::LoginIsEmpty);
    connect(HttpMgr::GetInstance().get(),&HttpMgr::SigLoginModeFinish,
           this,&LoginWidget::SlotLoginModFinish);

    connect(this,&LoginWidget::SigConnectTcp,TcpMgr::GetInstance().get(),&TcpMgr::SlotTcpConnect);
    //连接tcp管理者发出的连接成功信号
    connect(TcpMgr::GetInstance().get(), &TcpMgr::SigConSuccess, this, &LoginWidget::SlotTcpConFinish);
    // 连接失败
    connect(TcpMgr::GetInstance().get(), &TcpMgr::SigLoginFaild, this, &LoginWidget::SlotLoginFailed);

    connectTips();
    initHttpHandlers();

}

LoginWidget::~LoginWidget()
{
    delete ui;
}

void LoginWidget::Clear()
{
    ui->loginName->clear();
    ui->passwd->clear();
    setEnableBtn(true);
    showTip(tr("欢迎登录"),"normal");
}

void LoginWidget::showTip(QString str,QString state)
{

    ui->err_tip->setText(str); // 设置消息
    ui->err_tip->setProperty("state",state);
    repolish(ui->err_tip);
}

void LoginWidget::LoginIsEmpty()
{
    for(auto f : count){
        if(!f){
            showTip(tr("请输入完正确格式"),"err");
            return ;
        }
    }
    QJsonObject jsonObject;
    jsonObject["email"] = ui->loginName->text();
    jsonObject["passwd"] = xorString(ui->passwd->text()); // 对密码加密
    // 调用
    HttpMgr::GetInstance()->PostHttpReq(QUrl(gateUrlPrefix+"/user_login"),
                                        jsonObject,ReqId::ID_LOGIN_USER,Modules::LOGINMOD);
    setEnableBtn(false);
}

void LoginWidget::connectTips()
{
    connect(ui->loginName,&QLineEdit::editingFinished,this,[this](){
        if(ui->loginName->text() == ""){
            count[0] = false;
            AddTipErr(TipErr::TIP_USER_ERR, tr("用户名不能为空"));
        }else{
            count[0] = true;
            DelTipErr(TipErr::TIP_USER_ERR);
        }
    });
    connect(ui->passwd,&PasswdDialog::alterEidt,this,[this](){
        if(ui->passwd->text() == ""){
            count[1] = false;
            AddTipErr(TipErr::TIP_USER_ERR, tr("密码不能为空"));
        }else{
            count[1] = true;
            DelTipErr(TipErr::TIP_USER_ERR);
        }
    });
}

void LoginWidget::AddTipErr(TipErr te, QString tips)
{
    _tipErrs[te] = tips;
    showTip(tips, "err");
}

void LoginWidget::DelTipErr(TipErr te)
{
    _tipErrs.remove(te);
    if(_tipErrs.empty()){
      showTip("欢迎登录","normal");
      return;
    }

    showTip(_tipErrs.first(), "err");
}

void LoginWidget::SlotLoginModFinish(ReqId reqId, QString res, ErrorCodes err)
{
    // 判断是否异常
    if(err != ErrorCodes::SUCCESS){
        qDebug() << err;
        showTip(tr("网络请求错误"),"err");
        setEnableBtn(true);
        return ;
    }
    // 解析json
    QJsonDocument jsonDoc = QJsonDocument::fromJson(res.toUtf8());
    if(jsonDoc.isNull() & !jsonDoc.isObject()){
        if(jsonDoc.isNull()){
            qDebug() << "数据为空";
        }else{
            qDebug() << "json解析失败";
        }
        showTip(tr("数据解析失败"),"err");
        setEnableBtn(true);
        return ;
    }
    // 调用 reqId对应的function函数
    _handlers[reqId](jsonDoc.object());
    return ;
}

// 登录成功后去连接tcp服务器
void LoginWidget::SlotTcpConFinish(bool flag)
{
    if(flag){
        showTip("聊天服务连接成功，正在登录...","success");
        QJsonObject jsonObj;
        jsonObj["uid"] = _uid;
        jsonObj["token"] = _token;
        QJsonDocument doc(jsonObj);
        QString jsonString = doc.toJson(QJsonDocument::Indented);
        emit TcpMgr::GetInstance()->SigSendData(ReqId::ID_CHAT_LOGIN,jsonString);

    }else{
        showTip("网络异常","err");
        setEnableBtn(true);
    }
}

void LoginWidget::SlotLoginFailed(int n)
{
    QString result = QString("登录失败, err is %1")
            .arg(err);
    showTip(result,"err");
    setEnableBtn(true);
}

void LoginWidget::initHttpHandlers()
{
    _handlers.insert(ReqId::ID_LOGIN_USER,[this](const QJsonObject& jsonObj){
        int error = jsonObj["error"].toInt();
        qDebug() << jsonObj["message"].toString();
        if(error != ErrorCodes::SUCCESS){
            showTip(tr("邮箱或密码错误"),"err");
            ui->login_btn->setEnabled(true);
            ui->reset_btn->setEnabled(true);
            ui->register_btn->setEnabled(true);
            return ;
        }
        ServerInfo s;
        s.Uid = jsonObj["data"]["uid"].toInt();
        s.Host = jsonObj["data"]["host"].toString();
        s.Port = jsonObj["data"]["port"].toString();
        s.Token = jsonObj["data"]["token"].toString();
        _uid = s.Uid;
        _token = s.Token;
        qDebug() << "登录成功";
        emit SigConnectTcp(s);

    });
}

void LoginWidget::setEnableBtn(bool f)
{
    ui->login_btn->setEnabled(f);
    ui->reset_btn->setEnabled(f);
    ui->register_btn->setEnabled(f);
}

